<?php

namespace App\Library;

use Illuminate\Http\Request;
use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Config;

class Alipay
{
    public function _construct()
    {
        $options = new Config();
        $options->protocol = 'https';
        $options->gatewayHost = 'openapi.alipay.com';
        $options->signType = 'RSA2';

        $options->appId = '<-- 请填写您的AppId，例如：2019******440152 -->';

        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        $options->merchantPrivateKey = 'MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChQsPjswU1fW0aezd3V0zrSE4UKtnc753W3AG/JFX1Q08Xy1idiTT6OdlHH9AiC06gA30PO2YUURWDZ5NMLY2+/XszGS2+vdx05ClhNs3myBUrZYo+3qYPgx1ikZmUkGQ7W5qrvCEqiwAqII+L5FfSzmmjfUKdNKAWHTTus3GGVtkHvFWWSCoI8EKaCO58ly78p9fJfo/NKk+6yQ7Z4N4TfJvXQRYwupcwmwMx/Ak1PIwlFKvdGYuy9aT6oQiU7mYUqf14pkl5eo11xzgaOMS4MV3W6fBxImOMmiQmFOS6qKUS+Ykhx5CiVsMKv4k8TIMXT3jmaPmbff61M7Ujr4LDAgMBAAECggEANAZNGi2MFaikRTHRQCAbAaDvB5SXeq6XNlT9/0Nis+CGKMACk7hLLhrxnP+HbyREtlzJwNtB4HYUQbNtktrzatVuJJsP5gRslg1xyBodLUIJilmU0xmTa1e6aC1e5c37eCbibFsiPA5h/DVK+i+toaXT8NmdXwg2SUwc4pFjo5nmcBdHgYrhQmfbXsHYPt90J81w2uY0T6OSPM8/wPLsnNfmL7Q/YpzR4ngiDnNPxq1i7XHWatkcO7oxfi2X5DhqfS2D+crm6JJfzyViX3pcr1Wx283snKfOle68sZ6XnHMn7tvL6VLnruTSfG/bM2Zz4YGOGEbeZRJzWa5FYIrIkQKBgQDtkPJWDt37FvEa/wM23TNnF96pxF5R8AjKcUd4G+kxbb4NFZbk1M7HgMGEuoW3mcPN09oQJChZ3bzcpnIy7VdTx3BobXHv+JVsQNfkRzU6p2y8BbRE+EMykyNx6GL5qT2IWv1QNJTTYAgwQiPqN38bgmSHQWhfF4xmug2VuMCKWQKBgQCtxhNp/CGooKQ2yy96UraZcbdP/bP4GWf3dhHo4WlcqiU+1hLdmPFvfDJP53su92TRgrSGktHYkxIL2c5bY9qmYCltoN+PjEkHRvYdHzNjZWkkOgsnSz5kz+SUxAezaCzcNPrL4VWlirTxL9AEWQST1kig6QaTqbj+4rUX9iAaewKBgFDHFF+GtpwF9P2E8IbbN/s59pArIRcjUxni4rZIZ0ZTVmgEi0ZLxfO4KBUFhyoisp1uB5utb7r+1pUAU5xVb3ghPGuFq1Q5ZjVk5wPL4qGLBEH6fo1lDRRJS6gTqHPTxAR1S+TVvDUTVjVyh9u/+wxTjfMfnmmXDDpx0OSz6WQhAoGAbdGU6VDe0Jucy8gCnDJzlWtpJtM1jiA4NQpX7S2vEVGxshFF4OdMBWGexiKLFbZg74rDnZxho5XmPLkMEXN8ddKlu9OEFUrZyBCPbv4N0s3+8VcBP3bs2ncLhPyRxU6bsxqEOJ6SKskK6rWFp4m+O9ObGJ3LezwyXlpViewQg8sCgYA3HDBlNTxAj+NRIGNY+F3afhOr8qHv/L1vIY+THQ57kDgb08NbuUJOg/14fzXKarws5iqTexQyxYv0YHEeCCvWXI832MX1a5cFPO8hgS9K/7pIvgFc0mjO6bBxLUM5D+Cw7mt1drOqvaZJE2R6O4vHkXkTzJIGhXWTh0uopisHZA==';

        $options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt -->';
        $options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt" -->';
        $options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt -->';

        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        // $options->alipayPublicKey = '<-- 请填写您的支付宝公钥，例如：MIIBIjANBg... -->';
        //可设置异步通知接收服务地址（可选）
        //如果需要使用文件上传接口，请不要设置该参数
        $options->notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址，例如：https://www.test.com/callback -->";

        //可设置AES密钥，调用AES加解密相关接口时需要（可选）
        $options->encryptKey = "<-- 请填写您的AES密钥，例如：aa4BtZ4tspm2wnXLb1ThQA== -->";
        return $options;
    }
    public function ss()
    {
        //1. 设置参数（全局只需设置一次）Factory::setOptions(getOptions());
        try {
            //2. 发起API调用（以支付能力下的统一收单交易创建接口为例）
            $result = Factory::payment()->common()->create("iPhone6 16G", "2020******5526001", "88.88", "2088******718920");

            //3. 处理响应或异常
            if (!empty($result->code) && $result->code == 10000) {
                echo "调用成功". PHP_EOL;
            } else {
                echo "调用失败，原因：". $result->msg."，".$result->sub_msg.PHP_EOL;
            }
        } catch (Exception $e) {
            echo "调用失败，". $e->getMessage(). PHP_EOL;;
        }
    }
    function getOptions()
    {
        $options = new Config();
        $options->protocol = 'https';
        $options->gatewayHost = 'openapi.alipay.com';
        $options->signType = 'RSA2';

        $options->appId = '<-- 请填写您的AppId，例如：2019******440152 -->';

        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        $options->merchantPrivateKey = '<-- 请填写您的应用私钥，例如：MIIEvQIBADANB ... ... -->';

        $options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt -->';
        $options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt" -->';
        $options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt -->';

        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        // $options->alipayPublicKey = '<-- 请填写您的支付宝公钥，例如：MIIBIjANBg... -->';
        //可设置异步通知接收服务地址（可选）
        //如果需要使用文件上传接口，请不要设置该参数
        $options->notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址，例如：https://www.test.com/callback -->";

        //可设置AES密钥，调用AES加解密相关接口时需要（可选）
        $options->encryptKey = "<-- 请填写您的AES密钥，例如：aa4BtZ4tspm2wnXLb1ThQA== -->";
        return $options;
    }

    // 支付
    public function pay(Request $request, Order $order)
    {
        $request->validate([
            'type' => 'required|in:aliyun,wechat',
        ], [
            'type.required' => '支付类型不能为空',
            'type.in' => '支付类型只能是支付宝或者微信支付'
        ]);

        // 如果订单状态不是1，直接返回
        if ($order->status != 1) {
            return $this->response->errorBadRequest('订单状态异常，请重新下单！');
        }


        if ($request->input('type') == 'aliyun') {


            $order = [
                'out_trade_no' => $order->order_no,
                'total_amount' => $order->amount/100,
                'subject' => $order->goods()->first()->title.' 等 '.$order->goods()->count() .'件商品',
            ];

            return Pay::alipay()->scan($order);
        }
        if ($request->input('type') == 'wechat') {
        }
    }
    /**
     * 支付宝支付成功之后的回调
     */
    public function notifyAliyun(Request $request) {
        $alipay = Pay::alipay();

        try{
            $data = $alipay->callback(); // 是的，验签就这么简单！

            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况

            // 判断支付状态 成功的状态
            if ($data->trade_status == 'TRADE_SUCCESS' || $data->trade_status == 'TRADE_FINISHED') {
                // 查询订单
                $order = Order::where('order_no', $data->out_trade_no)->first();

                // 更新订单数据 （简单的写，如果要完整的要按照以上5点去写）
                $order->update([
                    'status' => 2, // 支付完成
                    'pay_time' => $data->gmt_payment, // 支付的时间
                    'pay_type' => '支付宝', // 支付的类型
                    'trade_no' => $data->trade_no, // 支付宝的单号 在写的退款的时候会用到
                ]);
            }

            // Log::info($data); 打印log知道回调都给了什么字段
            Log::debug('Alipay notify', $data->all()); // 打印log知道回调都给了什么字段
        } catch (\Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success();
    }
}
